//package com.inspur.edp.cef.generator.coreGenerator.base.serializer;
//
//import com.fasterxml.jackson.core.JsonParser;
//import com.fasterxml.jackson.databind.DeserializationContext;
//import com.inspur.edp.caf.generator.baseInfo.ParameterInfo;
//import com.inspur.edp.caf.generator.baseInfo.TypeInfo;
//import com.inspur.edp.caf.generator.method.ClassMethodGenerator;
//import com.inspur.edp.caf.generator.utils.ExpressionUtils;
//import com.inspur.edp.cef.api.RefObject;
//import com.inspur.edp.cef.designtime.api.IGspCommonField;
//import com.inspur.edp.cef.designtime.api.element.GspElementObjectType;
//import com.inspur.edp.cef.designtime.api.entity.GspCommonField;
//import com.inspur.edp.cef.generator.coreGenerator.base.entityGenerator.CefDataTypeImplGeneratorContext;
//import com.inspur.edp.cef.generator.coreGenerator.base.serializer.nestedserialize.GetSimpleAssoUdtSerializeContextMethodGen;
//import com.inspur.edp.cef.generator.coreGenerator.entityGenerator.serializer.CMChangeJsonConvertorGenUtils;
//import com.inspur.edp.cef.generator.coreGenerator.entityGenerator.serializer.EntityDataSerGenContext;
//import com.inspur.edp.cef.generator.overall.GenUtils;
//import com.inspur.edp.udt.designtime.api.entity.UnifiedDataTypeDef;
//import java.util.ArrayList;
//import java.util.Arrays;
//import org.eclipse.jdt.core.dom.AST;
//import org.eclipse.jdt.core.dom.Assignment;
//import org.eclipse.jdt.core.dom.Assignment.Operator;
//import org.eclipse.jdt.core.dom.Block;
//import org.eclipse.jdt.core.dom.Expression;
//import org.eclipse.jdt.core.dom.MethodInvocation;
//import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;
//import org.eclipse.jdt.core.dom.ReturnStatement;
//import org.eclipse.jdt.core.dom.StringLiteral;
//import org.eclipse.jdt.core.dom.SwitchStatement;
//import org.eclipse.jdt.core.dom.TypeLiteral;
//
//public class ReadModifyPropertyValueGenerator extends ClassMethodGenerator {
//
//  protected CefDataTypeImplGeneratorContext dataTypeGenContext;
//
//  public ReadModifyPropertyValueGenerator(CefDataTypeImplGeneratorContext dataTypeGenContext) {
//    this.dataTypeGenContext = dataTypeGenContext;
//  }
//
//  protected static final String methodName = "readModifyPropertyValue";
//  protected static final String paramReader = "reader";
//  protected static final String paramPropertyName = "propertyName";
//  //  protected static final String paramPropertyValue = "propertyValue";
//  protected static final String paramHasRead = "hasRead";
//  protected static final String paramSerializer = "serializer";
//
//  @Override
//  protected Block buildMethodBody() {
//    Block block = ast.newBlock();
//    SwitchStatement result = getSwitchBlock();
//    addCaseBlocks(result);
//    block.statements().add(result);
//    getDefaultStatement(block);
//
//    return block;
//  }
//
//  private SwitchStatement getSwitchBlock() {
//    SwitchStatement switchStatement = ast.newSwitchStatement();
//    switchStatement
//        .setExpression(ExpressionUtils.getQualifiedName(ast, paramPropertyName, "argvalue"));
//    return switchStatement;
//  }
//
//  private void addCaseBlocks(SwitchStatement result) {
//    for (IGspCommonField item : dataTypeGenContext.dataType.getContainElements()) {
//      addCaseBlock(item, result);
//    }
//  }
//
//  private void addCaseBlock(IGspCommonField vmElement, SwitchStatement result) {
//    SerItemGenUtil.buildSwitchLables(ast, result, vmElement.getLabelID());
//
//    Assignment setHasReadInvocation = ast.newAssignment();
//    setHasReadInvocation.setLeftHandSide(
//        ast.newQualifiedName(ast.newSimpleName(paramHasRead), ast.newSimpleName("argvalue")));
//    setHasReadInvocation.setOperator(Operator.ASSIGN);
//    setHasReadInvocation.setRightHandSide(ast.newBooleanLiteral(true));
//    result.statements().add(ast.newExpressionStatement(setHasReadInvocation));
//
//    Assignment propNameAs = ast.newAssignment();
//    propNameAs.setLeftHandSide(
//        ast.newQualifiedName(ast.newSimpleName(paramPropertyName), ast.newSimpleName("argvalue")));
//    propNameAs.setOperator(Operator.ASSIGN);
//    StringLiteral actualPropName = ast.newStringLiteral();
//    actualPropName.setLiteralValue(vmElement.getLabelID());
//    propNameAs.setRightHandSide(actualPropName);
//    result.statements().add(ast.newExpressionStatement(propNameAs));
//
//    ReturnStatement returnStatement = ast.newReturnStatement();
//    returnStatement.setExpression(getElementCase(vmElement));
//    result.statements().add(returnStatement);
//  }
//
//  private void getDefaultStatement(Block result) {
//    Assignment assignHasRead = ast.newAssignment();
//    assignHasRead.setLeftHandSide(
//        ast.newQualifiedName(ast.newSimpleName(paramHasRead), ast.newSimpleName("argvalue")));
//    assignHasRead.setOperator(Operator.ASSIGN);
//    assignHasRead.setRightHandSide(ast.newBooleanLiteral(false));
//    result.statements().add(ast.newExpressionStatement(assignHasRead));
//
//    ReturnStatement returnStatement = ast.newReturnStatement();
//    returnStatement.setExpression(ast.newNullLiteral());
//    result.statements().add(returnStatement);
//  }
//
//  private Expression getElementCase(IGspCommonField vmElement) {
//    if (vmElement.getIsUdt()) {
//      if (vmElement instanceof GspCommonField && vmElement.getHasAssociation()
//          && ((GspCommonField) vmElement).containRefElementNotFromAssoUdt()) {
//        return readEnrichedAssoUdtProperty(vmElement);
//      } else {
//        return readUdtProperty(vmElement);
//      }
//    }
//    if (vmElement.getObjectType() == GspElementObjectType.DynamicProp) {
//      return readDynamicPropSetProperty(vmElement);
//    }
//    Expression invocationExpress = null;
//    switch (vmElement.getObjectType()) {
//      case None:
//        invocationExpress = readBasicProperty(ast, vmElement, dataTypeGenContext);
//        break;
//      case Association:
//        String methodName =
//            dataTypeGenContext.getAssociationReadMetdNames().get(vmElement.getLabelID());
//        invocationExpress = readAssProperty(ast, vmElement, methodName);
//        break;
//      case Enum:
//        invocationExpress = readEnumProperty(vmElement);
//        break;
//      default:
//        throw new RuntimeException();
//    }
//    return invocationExpress;
//  }
//
//  //  readDynamicPropSetChange(JsonParser reader, DeserializationContext ctx, String dynPropSetPropName, IDynamicPropSerItem serItem)
//  private Expression readDynamicPropSetProperty(IGspCommonField element) {
//    MethodInvocation methodInvocation = ast.newMethodInvocation();
//    methodInvocation
//        .setName(ast.newSimpleName(CMChangeJsonConvertorGenUtils.mName_ReadDynamicPropChange));
//    methodInvocation.arguments().add(ast.newSimpleName(paramReader));
//    methodInvocation.arguments().add(ast.newSimpleName(paramSerializer));
//    methodInvocation.arguments().add(ExpressionUtils.getStringLiteral(ast, element.getLabelID()));
//    methodInvocation.arguments()
//        .add(ast.newSimpleName(DynamicSerItemsFieldGenerator.getFieldName(element)));
//    return methodInvocation;
//  }
//
//  private Expression readEnrichedAssoUdtProperty(IGspCommonField element) {
//    MethodInvocation methodInvocation = ast.newMethodInvocation();
//    methodInvocation
//        .setName(ast.newSimpleName(ReadEnrichedModifyPropValueGenerator.getName(element)));
//    methodInvocation.arguments().add(ast.newSimpleName(paramReader));
//    methodInvocation.arguments().add(ast.newSimpleName(paramSerializer));
//    return methodInvocation;
//  }
//
//  private Expression readUdtProperty(IGspCommonField element) {
//    UnifiedDataTypeDef udtDef =
//        dataTypeGenContext
//            .coreGenContext
//            .getCefGenContext()
//            .getMetadataContent(element.getUdtPkgName(), element.getUdtID());
//
//    MethodInvocation readNestedInvocation = ast.newMethodInvocation();
//    readNestedInvocation.setName(
//        ast.newSimpleName(CMChangeJsonConvertorGenUtils.mName_ReadNestedChange));
//    StringLiteral udtConfigId = ast.newStringLiteral();
//    udtConfigId.setLiteralValue(udtDef.getUdtType());
//    readNestedInvocation.arguments().add(udtConfigId);
//    readNestedInvocation.arguments().add(ast.newSimpleName(paramReader));
//    readNestedInvocation.arguments().add(ast.newSimpleName(paramSerializer));
//    if (SerItemGenUtil.getEnableStdDateTime(dataTypeGenContext)) {
//      readNestedInvocation.arguments().add(
//          GenUtils.getMethodInvocation(ast, null,
//              CMChangeJsonConvertorGenUtils.mName_GetNestedSerializeContext));
//    }
//    return readNestedInvocation;
//  }
//
//  /**
//   *
//   * @param ast
//   * @param element
//   * @param dataTypeGenContext 兼容原有静态方法未传递CefDataTypeImplGeneratorContext，可能为空
//   * @return
//   */
//  private static MethodInvocation readBasicProperty(AST ast, IGspCommonField element,
//      CefDataTypeImplGeneratorContext dataTypeGenContext) {
//    switch (element.getMDataType()) {
//      case String:
//      case Text:
//        return readStringProperty(ast, element);
//      case Integer:
//        return readIntProperty(ast, element);
//      case Decimal:
//        return readDecimalProperty(ast, element);
//      case Date:
//      case DateTime:
//        return readDateProperty(ast, element, dataTypeGenContext);
//      case Boolean:
//        return readBoolProperty(ast, element);
//      case Binary:
//        return readBinaryProperty(ast, element);
//      default:
//        throw new RuntimeException();
//    }
//  }
//
//  private static MethodInvocation readProperty(
//      AST ast, IGspCommonField element, String methodName) {
//    MethodInvocation methodInvocation = ast.newMethodInvocation();
//    methodInvocation.setName(ast.newSimpleName(methodName));
//    methodInvocation.arguments().add(ast.newSimpleName(paramReader));
//    return methodInvocation;
//  }
//
//  private static MethodInvocation readStringProperty(AST ast, IGspCommonField element) {
//    return readProperty(ast, element, CMChangeJsonConvertorGenUtils.mName_ReadString);
//  }
//
//  private static MethodInvocation readIntProperty(AST ast, IGspCommonField element) {
//    return readProperty(ast, element, CMChangeJsonConvertorGenUtils.mName_ReadInt);
//  }
//
//  private static MethodInvocation readDecimalProperty(AST ast, IGspCommonField element) {
//    return readProperty(ast, element, CMChangeJsonConvertorGenUtils.mName_ReadDecimal);
//  }
//
//  private static MethodInvocation readDateProperty(AST ast, IGspCommonField element,
//      CefDataTypeImplGeneratorContext dataTypeGenContext) {
//    if (SerItemGenUtil.getEnableStdDateTime(dataTypeGenContext)) {
//      return readProperty(ast, element, CMChangeJsonConvertorGenUtils.mName_ReadStdDateTime);
//    } else {
//      return readProperty(ast, element, CMChangeJsonConvertorGenUtils.mName_ReadDateTime);
//    }
//  }
//
//  private static MethodInvocation readBoolProperty(AST ast, IGspCommonField element) {
//    return readProperty(ast, element, CMChangeJsonConvertorGenUtils.mName_ReadBool);
//  }
//
//  private static MethodInvocation readBinaryProperty(AST ast, IGspCommonField element) {
//    return readProperty(ast, element, CMChangeJsonConvertorGenUtils.mName_ReadBytes);
//  }
//
//  public static Expression readAssProperty(
//      AST ast, IGspCommonField element, String assoMethodName) {
//    MethodInvocation readAssoInvocation = ast.newMethodInvocation();
//    try {
//      readAssoInvocation.setName(ast.newSimpleName(assoMethodName));
//    } catch (Exception e) {
//      throw new RuntimeException("assoMethodName不合法：" + assoMethodName, e);
//    }
//
//    readAssoInvocation.arguments().add(ast.newSimpleName(paramReader));
//    readAssoInvocation.arguments().add(ast.newSimpleName(paramSerializer));
//    return readAssoInvocation;
//  }
//
//  private MethodInvocation readEnumProperty(IGspCommonField element) {
//    TypeInfo assTypeSyntax = new TypeInfo(SerItemGenUtil.getEnumTypeName(element));
//    assTypeSyntax.setTypePackageName(
//        dataTypeGenContext.dataType.getGeneratedEntityClassInfo().getClassNamespace());
//    MethodInvocation readEnumInvocation = ast.newMethodInvocation();
//    readEnumInvocation.setName(ast.newSimpleName(CMChangeJsonConvertorGenUtils.mName_ReadEnum));
//    readEnumInvocation.arguments().add(ast.newSimpleName(paramReader));
//    TypeLiteral typeLiteral = ast.newTypeLiteral();
//    typeLiteral.setType(ast.newSimpleType(ast.newName(assTypeSyntax.getTypeFullName())));
//    readEnumInvocation.arguments().add(typeLiteral);
//    return readEnumInvocation;
//  }
//
//  // TODO: 暂不支持udt
//  // TODO: ReadEntityBasicInfoGenerator中重复代码
//  private java.lang.Class getUdtType(IGspCommonField element) {
//    throw new UnsupportedOperationException();
//    // var udtDef = (SimpleDataTypeDef)ServiceManager.GetService<IMetadataService>().GetRefMetadata(
//    //    entityDataSerGenContext.NodeGenContext.EntityGenContext.RelativePath, element.getUdtID(),
//    // element..getUdtPkgName()).getContent();
//    // var udtGenType = ReflectionUtil.GetTypeFromAssembly(udtDef.getAssemblyName(),
//    //    string.Concat(udtDef.getAssemblyName(), ".", udtDef.GetUdtEntityClassName()));
//    // return udtGenType.BaseType.GetGenericArguments()[0];
//  }
//
//  @Override
//  protected boolean getIsOverride() {
//    return true;
//  }
//
//  @Override
//  protected java.util.ArrayList<ModifierKeyword> getAccessModifiers() {
//    return new java.util.ArrayList<ModifierKeyword>(
//        java.util.Arrays.asList(new ModifierKeyword[]{ModifierKeyword.PUBLIC_KEYWORD}));
//  }
//
//  @Override
//  protected String getMethodName() {
//    return methodName;
//  }
//
//  @Override
//  protected java.util.ArrayList<ParameterInfo> getParameterCollection() {
//    // (JsonParser p, DeserializationContext ctxt, String propertyName, RefObject<Boolean> hasRead
//    ParameterInfo readerInfo = new ParameterInfo();
//    readerInfo.setParamName(paramReader);
//    readerInfo.setParamType(new TypeInfo(JsonParser.class));
//
//    ParameterInfo serializerInfo = new ParameterInfo();
//    serializerInfo.setParamName(paramSerializer);
//    serializerInfo.setParamType(new TypeInfo(DeserializationContext.class));
//
//    ParameterInfo propNameInfo = new ParameterInfo();
//    propNameInfo.setParamName(paramPropertyName);
//    TypeInfo propNameTypeInfo = new TypeInfo(RefObject.class);
//    propNameTypeInfo.setIsParameterizedType(true);
//    propNameTypeInfo.setArguments(
//        new ArrayList<TypeInfo>(Arrays.asList(new TypeInfo[]{new TypeInfo(String.class)})));
//    propNameInfo.setParamType(propNameTypeInfo);
//
//    ParameterInfo hasReadInfo = new ParameterInfo();
//    hasReadInfo.setParamName(paramHasRead);
//    TypeInfo hasReadTypeInfo = new TypeInfo(RefObject.class);
//    hasReadTypeInfo.setIsParameterizedType(true);
//    hasReadTypeInfo.setArguments(
//        new ArrayList<TypeInfo>(Arrays.asList(new TypeInfo[]{new TypeInfo(Boolean.class)})));
//    hasReadInfo.setParamType(hasReadTypeInfo);
//
//    return new java.util.ArrayList<ParameterInfo>(
//        java.util.Arrays.asList(
//            new ParameterInfo[]{readerInfo, serializerInfo, propNameInfo, hasReadInfo}));
//  }
//
//  @Override
//  protected TypeInfo getReturnType() {
//    return new TypeInfo("Object");
//  }
//
//  @Override
//  protected void beforeInitialize() {
//    super.beforeInitialize();
//    for (IGspCommonField item : dataTypeGenContext.dataType.getContainElements()) {
//      if (!(item instanceof GspCommonField)
//          || item.getObjectType() != GspElementObjectType.Association || !item.getIsUdt()
//          || !((GspCommonField) item).containRefElementNotFromAssoUdt()) {
//        continue;
//      }
//      addChildGenerators(
//          new ReadEnrichedModifyPropValueGenerator(dataTypeGenContext, (GspCommonField) item));
//      addChildGenerators(
//          new GetSimpleAssoUdtSerializeContextMethodGen(dataTypeGenContext, item));
//    }
//  }
//}
